package com.xiaoshuidi.cloud.framework.fadada.core.service;

import cn.hutool.core.codec.Base64;
import com.xiaoshuidi.cloud.framework.fadada.core.FadadaAuthServiceApi;
import com.xiaoshuidi.cloud.framework.fadada.core.enums.FadadaReturnCodeConstants;
import com.xiaoshuidi.cloud.framework.fadada.core.service.dto.CompanyCertInfoRes;
import com.xiaoshuidi.cloud.framework.fadada.core.service.dto.FadadaResponse;
import com.xiaoshuidi.cloud.framework.fadada.core.service.dto.PersonCertInfoRes;
import com.xiaoshuidi.cloud.framework.fadada.core.service.dto.VerifyUrlRes;
import com.alibaba.fastjson.JSONObject;
import com.fadada.sdk.base.client.FddBaseClient;
import com.fadada.sdk.base.model.req.RegisterAccountParams;
import com.fadada.sdk.verify.client.FddVerifyClient;
import com.fadada.sdk.verify.model.req.*;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.Objects;

/**
 * @Description:
 * @author: zhaoyu
 * @date: 2023/4/23
 */
@Slf4j
@Service
@Data
public class FadadaAuthServiceApiImpl implements FadadaAuthServiceApi {
    public FadadaAuthServiceApiImpl() {
    }

    @Value("${fadada.app_id}")
    private String APPID;
    @Value("${fadada.app_secret}")
    private String APPKEY;
    @Value("${fadada.version}")
    private String V;
    @Value("${fadada.host}")
    private String HOST;

    @Override
    public String accountRegister(RegisterAccountParams params) {
        FddBaseClient baseClient = new FddBaseClient(APPID, APPKEY, V, HOST);
        String result = baseClient.invokeRegisterAccount(params);
        log.info("法大大注册账号返回数据：{}", result);
        if (StringUtils.isNotBlank(result)){
            FadadaResponse fadadaResponse = JSONObject.parseObject(result, FadadaResponse.class);
            if (Objects.nonNull(fadadaResponse)){
                String data = fadadaResponse.getData();
                if (StringUtils.isNotBlank(data)){
                    return data;
                }
            }
        }
        return null;
    }

    @Override
    public VerifyUrlRes getPersonVerifyUrl(PersonVerifyUrlParams params) {
        FddVerifyClient client = new FddVerifyClient(APPID, APPKEY, V, HOST);
        String result = client.invokePersonVerifyUrl(params);
        log.info("法大大获取个人实名地址返回数据：{}", result);
        if (StringUtils.isNotBlank(result)){
            FadadaResponse fadadaResponse = JSONObject.parseObject(result, FadadaResponse.class);
            if (Objects.nonNull(fadadaResponse)){
                String data = fadadaResponse.getData();
                if (StringUtils.isNotBlank(data)){
                    VerifyUrlRes verifyUrlRes = JSONObject.parseObject(data, VerifyUrlRes.class);
                    //base64解密
                    String url = verifyUrlRes.getUrl();
                    verifyUrlRes.setUrl(Base64.decodeStr(url));
                    return verifyUrlRes;
                }
            }
        }
        return null;
    }


    @Override
    public VerifyUrlRes getCompanyVerifyUrl(CompanyVerifyUrlParams params) {
        FddVerifyClient client = new FddVerifyClient(APPID, APPKEY, V, HOST);
//        CompanyVerifyUrlParams params = new CompanyVerifyUrlParams();
//        params.setCustomerId("填入注册企业账户时返回的客户编号");
//        params.setPageModify("1");//1允许 2不允许 默认为1
//        //以下是非必填参数
//        params.setVerifiedWay("");//实名认证套餐类型：  0：标准方案（对公打款+纸质审核+法人身份+法人授权）；1：对公打款；2：纸质审核；3：法人身份（授权）认证
//        params.setMVerifiedWay("");//管理员认证套餐类型：  0：三要素标准方案；  1：三要素补充方案；  2：四要素标准方案；  3：四要素补充方案；  4：纯三要素方案；  5：纯四要素方案；
//        params.setLegalAllowCompanyVerifyWay("");//指定管理员为"法人"身份下，允许的认证方式∶ 1.法人身份认证; 2.对公打款认证; 3.纸质材料认证;
//        params.setAgentAllowCompanyVerifyWay("");//指定管理员为"代理人"身份下，允许的认证方式∶ 1.法人授权认证; 2.对公打款认证; 3.纸质材料认证;可同时传入多个值，如"1,2“，表示代理身份下，只允许"法人授权认证"及"对公打款认证"方式，页面隐藏纸质材料认证"方式;传入空值时，表示允许所有认证方式;
//        params.setIdPhotoOptional("");//0-只需要头像面 1-头像面与国徽面都需要 2-都不需要 默认为0
//        //公司信息
//        CompanyVerifyUrlParams.CompanyInfo companyInfo = new CompanyVerifyUrlParams.CompanyInfo();
//        companyInfo.setCompanyName(CompanyName);
//        companyInfo.setCreditNo(CompanyCreditNO);
//        companyInfo.setCreditImagePath("");
//        params.setCompanyInfo(null);
//
//        params.setCompanyPrincipalType("");//1.法人，2代理人
//        //法人信息
//        CompanyVerifyUrlParams.LegalInfo legalInfo = new CompanyVerifyUrlParams.LegalInfo();
//        legalInfo.setLegalName(CustomerName);
//        legalInfo.setLegalId(CustomerIdentNo);
//        legalInfo.setLegalMobile(Mobile);
//        legalInfo.setLegalIdFrontPath("");
//        legalInfo.setLegalIdBackPath("");
//        legalInfo.setBankCardNo(BankCardNo);
//        params.setLegalInfo(null);
//        params.setLegalIdFrontImg(null);
//        //代理人信息
//        CompanyVerifyUrlParams.AgentInfo agentInfo = new CompanyVerifyUrlParams.AgentInfo();
//        agentInfo.setAgentName(CustomerName);
//        agentInfo.setAgentId(CustomerIdentNo);
//        agentInfo.setAgentMobile(Mobile);
//        agentInfo.setAgentIdFrontPath("");
//        agentInfo.setAgentIdBackPath("");
//        agentInfo.setBankCardNo(BankCardNo);
//        params.setAgentInfo(null);
//        params.setAgentIdFrontImg(null);
//        params.setCreditImage(null);
//        //银行卡信息
//        CompanyVerifyUrlParams.BankInfo bankInfo = new CompanyVerifyUrlParams.BankInfo();
//        bankInfo.setBankName("招商银行");
//        bankInfo.setBankId("");
//        bankInfo.setSubbranchName("");
//        params.setBankInfo(null);
//        params.setBankProvinceName("");
//        params.setBankCityName("");
//
//        params.setCertFlag("");//是否认证成功后自动绑定实名信息  参数值为“0”：不自动绑定，参数值为“1”：自动绑定
//        params.setOption("");//add（新增）modify（修改）不传默认add
//        params.setVerifiedSerialNo("");//管理员认证流水号
//        params.setAuthorizationFile(null);//企业注册申请表
//        params.setLegalName("");//法人姓名（代理人认证想要传法人姓名可用此参数）
//        params.setMobile("");//法人/代理人/个人手机号
//        params.setLegalAuthorizedMobile("");//法人授权手机号,当接口中传入了“法人授权手机号”字段时，页面中选择法人授权认证时，会将传入的手机号展示出来
//        params.setLang("");//zh:中文，en:英文默认：中文
//        params.setOrganization_type("");//0：企业；1：政府/事业单位；2：其他组织；3：个体工商户
//        params.setReturnUrl("");
//        params.setNotifyUrl("");

        String result = client.invokeCompanyVerifyUrl(params);
        log.info("法大大获取企业实名地址返回数据：{}", result);
        if (StringUtils.isNotBlank(result)){
            FadadaResponse fadadaResponse = JSONObject.parseObject(result, FadadaResponse.class);
            if (Objects.nonNull(fadadaResponse)){
                if (Objects.nonNull(fadadaResponse)){
                    String data = fadadaResponse.getData();
                    if (StringUtils.isNotBlank(data)){
                        VerifyUrlRes verifyUrlRes = JSONObject.parseObject(data, VerifyUrlRes.class);
                        //base64解密
                        String url = verifyUrlRes.getUrl();
                        verifyUrlRes.setUrl(Base64.decodeStr(url));
                        return verifyUrlRes;
                    }
                }
            }
        }
        return null;
    }


    @Override
    public PersonCertInfoRes findPersonCertInfo(FindPersonCertParams params) {
        FddVerifyClient client = new FddVerifyClient(APPID, APPKEY, V, HOST);
//        FindPersonCertParams params = new FindPersonCertParams();
//        params.setVerifiedSerialNo(""); //此处填获取个人实名认证地址返回的交易号
        String result = client.invokeFindPersonCert(params);
        log.info("法大大查询个人实名认证信息返回数据：{}", result);
        if (StringUtils.isNotBlank(result)){
            FadadaResponse fadadaResponse = JSONObject.parseObject(result, FadadaResponse.class);
            if (Objects.nonNull(fadadaResponse)){
                String data = fadadaResponse.getData();
                if (StringUtils.isNotBlank(data)){
                    PersonCertInfoRes personCertInfoRes = JSONObject.parseObject(data, PersonCertInfoRes.class);
                    return personCertInfoRes;
                }
            }
        }
        return null;
    }

    @Override
    public CompanyCertInfoRes findCompanyCertInfo(FindCompanyCertParams params) {
        FddVerifyClient client = new FddVerifyClient(APPID, APPKEY, V, HOST);
//        FindCompanyCertParams params = new FindCompanyCertParams();
//        params.setVerifiedSerialNo("");//此处填获取企业实名认证地址返回的交易号
        String result = client.invokeFindCompanyCert(params);
        log.info("法大大查询企业实名认证信息返回数据：{}", result);
        if (StringUtils.isNotBlank(result)){
            FadadaResponse fadadaResponse = JSONObject.parseObject(result, FadadaResponse.class);
            if (Objects.nonNull(fadadaResponse)){
                String data = fadadaResponse.getData();
                if (StringUtils.isNotBlank(data)){
                    CompanyCertInfoRes companyCertInfoRes = JSONObject.parseObject(data, CompanyCertInfoRes.class);
                    return companyCertInfoRes;
                }
            }
        }
        return null;
    }

    @Override
    public String getFile(FileForUUIDParams params) {
        FddVerifyClient client = new FddVerifyClient(APPID, APPKEY, V, HOST);
//        FileForUUIDParams params = new FileForUUIDParams();
//        params.setUuid("");//此处传个人实名认证接口查询中返回的认证图片id，或查询企业认证信息中返回的企业认证申请表id
//        params.setDocType("0");//0：图片（默认图片）1：pdf (仅支持企业申请表模板)
        String result = client.invokeFileForUUID(params);
        log.info("法大大通过uuid下载文件返回数据：{}", result);
        if (StringUtils.isNotBlank(result)){
            return result;
        }
        return null;
    }

    @Override
    public Boolean applyCert(ApplyCertParams params) {
        FddVerifyClient client = new FddVerifyClient(APPID, APPKEY, V, HOST);
//        ApplyCertParams params = new ApplyCertParams();
//        params.setCustomerId("注册个人账号时返回"); //客户编号
//        params.setVerifiedSerialNo(""); //填写获取实名认证地址返回的交易号ransactionNo
        String result = client.invokeApplyCert(params);
        log.info("法大大绑定实名信息返回数据：{}", result);
        if (StringUtils.isNotBlank(result)){
            FadadaResponse fadadaResponse = JSONObject.parseObject(result, FadadaResponse.class);
            if (Objects.nonNull(fadadaResponse) && Integer.valueOf(fadadaResponse.getCode()).intValue() == FadadaReturnCodeConstants.SUCCESS.getCode().intValue()){
                return true;
            }
        }
        return false;
    }
}
